home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / download_utils.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  5.4 KB  |  213 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from os import access, F_OK
  5. from urlparse import urlparse
  6. import os.path as os
  7. import re
  8. import urllib
  9. import filetypes
  10. import util
  11. from util import checkF, checkU, returnsFilename
  12. from platformutils import unicodeToFilename, unmakeURLSafe
  13. URIPattern = re.compile('^([^?]*/)?([^/?]*)/*(\\?(.*))?$')
  14. MAX_FILENAME_LENGTH = 100
  15. MAX_FILENAME_EXTENSION_LENGTH = 50
  16.  
  17. def fixFileURLS(url):
  18.     """Fix file URLS that start with file:// instead of file:///.  Note: this
  19.     breaks for file URLS that include a hostname, but we never use those and
  20.     it's not so clear what that would mean anyway -- file URLs is an ad-hoc
  21.     spec as I can tell.."""
  22.     if url.startswith('file://'):
  23.         if not url.startswith('file:///'):
  24.             url = 'file:///%s' % url[len('file://'):]
  25.         
  26.         url = url.replace('\\', '/')
  27.     
  28.     return url
  29.  
  30.  
  31. def defaultPort(scheme):
  32.     if scheme == 'https':
  33.         return 443
  34.     elif scheme == 'http':
  35.         return 80
  36.     elif scheme == 'file':
  37.         return None
  38.     elif util.chatter:
  39.         print 'WARNING: Assuming port 80 for scheme: %s' % scheme
  40.     
  41.     return 80
  42.  
  43.  
  44. def parseURL(url):
  45.     url = fixFileURLS(url)
  46.     (scheme, host, path, params, query, fragment) = util.unicodify(list(urlparse(url)))
  47.     if host.count(':') > 1:
  48.         host = host[0:host.rfind(':')]
  49.     
  50.     if scheme == '' and util.chatter:
  51.         print 'WARNING: %r has no scheme' % url
  52.     
  53.     if ':' in host:
  54.         (host, port) = host.split(':')
  55.         
  56.         try:
  57.             port = int(port)
  58.         print 'DTV: parseURL: WARNING: invalid port for %r' % url
  59.         port = defaultPort(scheme)
  60.  
  61.     else:
  62.         port = defaultPort(scheme)
  63.     host = host.lower()
  64.     scheme = scheme.lower()
  65.     path = path.replace('|', ':')
  66.     if path == '' or path[0] != '/':
  67.         path = '/' + path
  68.     elif re.match('/[a-zA-Z]:', path):
  69.         path = path[1:]
  70.     
  71.     fullPath = path
  72.     if params:
  73.         fullPath += ';%s' % params
  74.     
  75.     if query:
  76.         fullPath += '?%s' % query
  77.     
  78.     return (scheme, host, port, fullPath)
  79.  
  80.  
  81. def getFileURLPath(url):
  82.     (scheme, host, port, path) = parseURL(url)
  83.     if scheme != 'file':
  84.         raise ValueError('%r is not a file URL' % url)
  85.     
  86.     return unmakeURLSafe(path)
  87.  
  88.  
  89. def checkFilenameExtension(filename, httpInfo):
  90.     checkF(filename)
  91.     if 'content-type' in httpInfo and not filetypes.isAllowedFilename(filename):
  92.         guessedExt = filetypes.guessExtension(httpInfo['content-type'])
  93.         if guessedExt is not None:
  94.             filename += guessedExt
  95.         
  96.     
  97.     return filename
  98.  
  99.  
  100. def nextFreeFilename(name):
  101.     checkF(name)
  102.     if not access(name, F_OK):
  103.         return name
  104.     
  105.     parts = name.split('.')
  106.     count = 1
  107.     if len(parts) == 1:
  108.         newname = '%s.%s' % (name, count)
  109.         while access(newname, F_OK):
  110.             count += 1
  111.             newname = '%s.%s' % (name, count)
  112.     else:
  113.         parts[-1:-1] = [
  114.             str(count)]
  115.         newname = '.'.join(parts)
  116.         while access(newname, F_OK):
  117.             count += 1
  118.             parts[-2] = str(count)
  119.             newname = '.'.join(parts)
  120.     return newname
  121.  
  122. nextFreeFilename = returnsFilename(nextFreeFilename)
  123.  
  124. def filenameFromURL(url, clean = False):
  125.     checkU(url)
  126.     
  127.     try:
  128.         match = URIPattern.match(url)
  129.         if match is None:
  130.             return unicodeToFilename(url)
  131.         
  132.         filename = match.group(2)
  133.         query = match.group(4)
  134.         if not filename:
  135.             ret = query
  136.         elif not query:
  137.             ret = filename
  138.         else:
  139.             (root, ext) = os.path.splitext(filename)
  140.             ret = u'%s-%s%s' % (root, query, ext)
  141.         if ret is None:
  142.             ret = u'unknown'
  143.         
  144.         if clean:
  145.             return cleanFilename(ret)
  146.         else:
  147.             return unicodeToFilename(ret)
  148.     except:
  149.         return unicodeToFilename(u'unknown')
  150.  
  151.  
  152. filenameFromURL = returnsFilename(filenameFromURL)
  153.  
  154. def cleanFilename(filename):
  155.     for char in ':?><|*/\\"\'':
  156.         filename = filename.replace(char, '')
  157.     
  158.     if len(filename) == 0:
  159.         return unicodeToFilename(u'_')
  160.     
  161.     if len(filename) > MAX_FILENAME_LENGTH:
  162.         (base, ext) = os.path.splitext(filename)
  163.         ext = ext[:MAX_FILENAME_EXTENSION_LENGTH]
  164.         base = base[:MAX_FILENAME_LENGTH - len(ext)]
  165.         filename = base + ext
  166.     
  167.     if type(filename) == str:
  168.         return unicodeToFilename(filename.decode('ascii', 'replace'))
  169.     else:
  170.         return unicodeToFilename(filename)
  171.  
  172. cleanFilename = returnsFilename(cleanFilename)
  173.  
  174. def saveData(target, suggested_basename, data):
  175.     
  176.     try:
  177.         os.makedirs(target)
  178.     except:
  179.         pass
  180.  
  181.     filename = os.path.join(target, suggested_basename)
  182.     
  183.     try:
  184.         tmp_filename = filename + '.part'
  185.         tmp_filename = nextFreeFilename(tmp_filename)
  186.         output = file(tmp_filename, 'wb')
  187.         output.write(data)
  188.         output.close()
  189.     except IOError:
  190.         
  191.         try:
  192.             os.remove(tmp_filename)
  193.         except:
  194.             pass
  195.  
  196.         raise 
  197.  
  198.     filename = nextFreeFilename(filename)
  199.     needsSave = True
  200.     
  201.     try:
  202.         os.remove(filename)
  203.     except:
  204.         pass
  205.  
  206.     os.rename(tmp_filename, filename)
  207.     return filename
  208.  
  209.  
  210. def filterDirectoryName(name):
  211.     return re.sub('[^a-zA-Z0-9]', '-', name)
  212.  
  213.